package com.imooc.poker_game_v2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.function.Function;

/**
 * 
 * 扑克游戏
 * 
 */
public class Game {
	
	// 玩家
	private List<Player> players = new ArrayList<Player>();
	// 当前的牌
	private Poker poker = new Poker();
	// 控制台, 接收输入的值
	private Scanner scanner = new Scanner(System.in);
	
	public void startGame() {
		// 创建玩家
		createPlayer();
		// 发牌
		dealPoker();
		// 统计
		comparePoker();
	}
	
	/**
	 * 创建玩家
	 */
	public void createPlayer() {
		System.out.println("-----创建玩家-----");
		
		int playerNum = getInput("请输入玩家的人数!", palyCount -> {
			if (palyCount < 2) {
				System.out.println("玩家人数最少有2位! 请重新输入!");
				return false;
			}
			
			if (palyCount > poker.size()) {
				System.out.println("输入的玩家数量不能大于扑克牌的数量(" + poker.size() + ")!请重新输入!");
				return false;
			}
			return true;
		});
		
		for (int i = 1; i <= playerNum; i++) { //这所以写个循环，是为了方便修改玩家的人数，只需改一下循环的判断条件就好了
            System.out.print("请输入第" + i + "位玩家的姓名：");
            players.add(new Player(i, scanner.next()));
        }
		
		// 输出各位玩家的信息
		for (Player player : players) {
			System.out.println("------ 欢迎玩家: " + player.getName());
		}
	}
	
	/**
	 * 发牌
	 */
	public void dealPoker() {
		System.out.println("-------开始发牌...--------");
		int cardNum = getInput("请设置给每个玩家发多少张牌", cardCount -> {
			if(cardCount <= 0) {
				System.out.println("发牌数必须大于0, 请重新输入!");
				return false;
			}
			
			if (cardCount * players.size() > poker.size()) {
				System.out.println("非法的发牌数, 总发牌数量不能超过扑克牌的数量(" + poker.size() + ")!请重新输入!");
				return false;
			}
			return true;
		});
		
		// 随机发牌
		int limit = players.size() * cardNum;
        for (int i = 0; i < limit; i++) {
            players.get(i % players.size()).add(poker.get(i));
        }
        
		System.out.println("-------发牌结束!-------");
	}
	
	/**
	 * 统计
	 */
	public void comparePoker() {
		System.out.println("------开始统计!-------");
		players.forEach(Player::showMaxCard);
		
		Player winner = this.getWinner();
		System.out.println("-----------玩家[" + winner.getName() +"]获胜!-----------");
		
		System.out.println("====玩家各自的手牌为: ====");
		players.forEach(Player::showCards);
	}
	
	private Player getWinner() {
		Collections.sort(players);
		return players.get(0);
	}
	
	/**
     * 从控制台接受用户输入的一个正整数
     *
     * @param hint     提示信息
     * @param function 用户判断用户输入的信息是否合法，如果不合法，需要重新输入
     * @return
     */
	public int getInput(String hint, Function<Integer, Boolean> function) {
		while (true) {
			System.out.println(hint);
			try {
				int input = scanner.nextInt();
				if (!function.apply(input)) {
					continue;
				}
				return input;
			} catch (Exception e) {
				System.out.println("输入不合法! 请重新输入!");
				// 如果出现异常, 则跳过本次输入的信息
				scanner.skip(".*");
			}
		}
	}
}
